Update the memory_op() hypercall. Add two new subcommands, to
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Mon, 21 Nov 2005 15:56:39 +0000 (16:56 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Mon, 21 Nov 2005 15:56:39 +0000 (16:56 +0100)
query a domain's current and maximum memory reservation. Also,
XENMEM_maximum_ram_page now returns the max_page directly,
rather than writing through a passed-in pointer.

Also, disable PAE in the default config (accidentally checked
in two changesets ago).

Signed-off-by: Keir Fraser <keir@xensource.com>
Config.mk
linux-2.6-xen-sparse/arch/xen/i386/kernel/swiotlb.c
linux-2.6-xen-sparse/arch/xen/x86_64/kernel/e820.c
tools/libxc/xc_private.c
tools/libxc/xg_save_restore.h
xen/common/memory.c
xen/include/public/memory.h

index 645457376a8d38c936f48fbae8d5685d7379fe0f..3b24b07abed93de1bf27491b31b4665dbb3326b5 100644 (file)
--- a/Config.mk
+++ b/Config.mk
@@ -3,7 +3,7 @@
 # Currently supported architectures: x86_32, x86_64
 XEN_COMPILE_ARCH    ?= $(shell uname -m | sed -e s/i.86/x86_32/)
 XEN_TARGET_ARCH     ?= $(XEN_COMPILE_ARCH)
-XEN_TARGET_X86_PAE  ?= y
+XEN_TARGET_X86_PAE  ?= n
 
 # Tools to run on system hosting the build
 HOSTCC     = gcc
index 7a50607f05929ee28b3e6d9d69d1e459a01f1040..7ec30325dd6f28d8f6a1f1f253b5399a8da8cd50 100644 (file)
@@ -178,6 +178,8 @@ swiotlb_init_with_default_size (size_t default_size)
 void
 swiotlb_init(void)
 {
+       long ram_end;
+
        /* The user can forcibly enable swiotlb. */
        if (swiotlb_force)
                swiotlb = 1;
@@ -187,9 +189,7 @@ swiotlb_init(void)
          * which we take to mean more than 2GB.
          */
        if (xen_start_info->flags & SIF_INITDOMAIN) {
-               unsigned long ram_end;
-               if (HYPERVISOR_memory_op(XENMEM_maximum_ram_page, &ram_end))
-                       BUG();
+               ram_end = HYPERVISOR_memory_op(XENMEM_maximum_ram_page, NULL);
                if (ram_end > 0x7ffff)
                        swiotlb = 1;
        }
index 8aff532d39152c5557cb28c4d969cc88dbc6b392..f2a7160a0e3fe5967e5212d220c828d0ab5cce8a 100644 (file)
@@ -586,7 +586,7 @@ void __init e820_reserve_resources(void)
        free_bootmem(__pa(map), PAGE_SIZE);
 
        if (!found) {
-               HYPERVISOR_memory_op(XENMEM_maximum_ram_page, &gapstart);
+               gapstart = HYPERVISOR_memory_op(XENMEM_maximum_ram_page, NULL);
                gapstart = (gapstart << PAGE_SHIFT) + 1024*1024;
                printk(KERN_ERR "PCI: Warning: Cannot find a gap in the 32bit address range\n"
                       KERN_ERR "PCI: Unassigned devices with 32bit resource registers may break!\n");
index 904dddc5d12f14a8f25d9773e89840d01c8c66b3..526d77b337802759c45223d09847f9bab359ae66 100644 (file)
@@ -214,13 +214,6 @@ int xc_memory_op(int xc_handle,
             goto out1;
         }
         break;
-    case XENMEM_maximum_ram_page:
-        if ( mlock(arg, sizeof(unsigned long)) != 0 )
-        {
-            PERROR("Could not mlock");
-            goto out1;
-        }
-        break;
     }
 
     ret = do_xen_hypercall(xc_handle, &hypercall);
@@ -234,9 +227,6 @@ int xc_memory_op(int xc_handle,
             safe_munlock(reservation->extent_start,
                          reservation->nr_extents * sizeof(unsigned long));
         break;
-    case XENMEM_maximum_ram_page:
-        safe_munlock(arg, sizeof(unsigned long));
-        break;
     }
 
  out1:
index c735deab41113cd1fa9dd677ddade66250ed44bc..b9a4d381222362fd9bbac7f16265cb52c87d577c 100644 (file)
@@ -64,7 +64,6 @@ static int get_platform_info(int xc_handle, uint32_t dom,
 { 
     xen_capabilities_info_t xen_caps = "";
     xen_platform_parameters_t xen_params;
-    
 
     if (xc_version(xc_handle, XENVER_platform_parameters, &xen_params) != 0)
         return 0;
@@ -72,8 +71,7 @@ static int get_platform_info(int xc_handle, uint32_t dom,
     if (xc_version(xc_handle, XENVER_capabilities, &xen_caps) != 0)
         return 0;
 
-    if (xc_memory_op(xc_handle, XENMEM_maximum_ram_page, max_mfn) != 0)
-        return 0; 
+    *max_mfn = xc_memory_op(xc_handle, XENMEM_maximum_ram_page, NULL);
     
     *hvirt_start = xen_params.virt_start;
 
index ceef1886f690cfa28cbfbeb86a168c1a0dd02f13..79d6dca2e327e9c767af94973dab0870391e2c92 100644 (file)
@@ -136,6 +136,7 @@ long do_memory_op(int cmd, void *arg)
     struct domain *d;
     int rc, start_extent, op, flags = 0, preempted = 0;
     struct xen_memory_reservation reservation;
+    domid_t domid;
 
     op = cmd & ((1 << START_EXTENT_SHIFT) - 1);
 
@@ -191,9 +192,26 @@ long do_memory_op(int cmd, void *arg)
         break;
 
     case XENMEM_maximum_ram_page:
-        if ( put_user(max_page, (unsigned long *)arg) )
+        rc = max_page;
+        break;
+
+    case XENMEM_current_reservation:
+    case XENMEM_maximum_reservation:
+        if ( get_user(domid, (domid_t *)arg) )
             return -EFAULT;
-        rc = 0;
+
+        if ( likely((domid = (unsigned long)arg) == DOMID_SELF) )
+            d = current->domain;
+        else if ( !IS_PRIV(current->domain) )
+            return -EPERM;
+        else if ( (d = find_domain_by_id(domid)) == NULL )
+            return -ESRCH;
+
+        rc = (op == XENMEM_current_reservation) ? d->tot_pages : d->max_pages;
+
+        if ( unlikely(domid != DOMID_SELF) )
+            put_domain(d);
+
         break;
 
     default:
index 8a5f70c5b1b793a12adf6e997845a95bfb1c7141..767f10ac3984abcb5b5898ddb22fe9875d612ad1 100644 (file)
@@ -9,15 +9,13 @@
 #ifndef __XEN_PUBLIC_MEMORY_H__
 #define __XEN_PUBLIC_MEMORY_H__
 
-/* arg == addr of struct xen_memory_reservation. */
+/*
+ * Increase or decrease the specified domain's memory reservation. Returns a
+ * -ve errcode on failure, or the # extents successfully allocated or freed.
+ * arg == addr of struct xen_memory_reservation.
+ */
 #define XENMEM_increase_reservation 0
-
-/* arg == addr of struct xen_memory_reservation. */
 #define XENMEM_decrease_reservation 1
-
-/* arg == addr of unsigned long. */
-#define XENMEM_maximum_ram_page     2
-
 typedef struct xen_memory_reservation {
 
     /*
@@ -47,6 +45,21 @@ typedef struct xen_memory_reservation {
 
 } xen_memory_reservation_t;
 
+/*
+ * Returns the maximum machine frame number of mapped RAM in this system.
+ * This command always succeeds (it never returns an error code).
+ * arg == NULL.
+ */
+#define XENMEM_maximum_ram_page     2
+
+/*
+ * Returns the current or maximum memory reservation, in pages, of the
+ * specified domain (may be DOMID_SELF). Returns -ve errcode on failure.
+ * arg == addr of domid_t.
+ */
+#define XENMEM_current_reservation  3
+#define XENMEM_maximum_reservation  4
+
 #endif /* __XEN_PUBLIC_MEMORY_H__ */
 
 /*